#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 10
#define ERROR -100
// 队列：只能在一端插入，而在另一端删除
// 队列的顺序存储
struct QNode
{
    int Data[MAXSIZE];
    int rear;  // 记录队列尾元素位置的变量,每加一个元素rear＋1
    int front; // 记录队列头元素位置的变量，每减一个元素front+1
};
typedef struct QNode *Queue; // Queue即队列

// 上面的数组如果理解成直线，就会出现“front到达数组尾部而数组头部仍存在空间”的问题，我们可以采用循环数组的方式来解决这个问题
// 即将数组理解为一个圆

// 循环数组中，我们该怎么判断数组有没有满呢？
// 可不可以用“当front == rear,数组满”作为判断条件？
// 显然是不行的，因为当数组为空时，front 也 == rear。
// 要解决上面的一个问题，我们有一下解决方法：
// 使用额外标记：Size 或者 tag
// 仅使用n-1个数组空间

// 入队列
void AddQ(Queue PtrQ, int item)
{
    // 先判断队列有没有满
    if ((PtrQ->rear + 1) % MAXSIZE == PtrQ->front) // 这是一个循环队列，所以始终要注意%
    {
        printf("队列满\n");
        return;
    }
    else
    {
        PtrQ->rear = (PtrQ->rear + 1) % MAXSIZE;
        PtrQ->Data[PtrQ->rear] = item;
    }
}

// 出队列
int DeleteQ(Queue PtrQ)
{
    // 先判断队列是否为空
    if (PtrQ->rear == PtrQ->front)
    {
        printf("队列为空，无法删除");
        return ERROR;
    }
    else
    {
        PtrQ->front = (PtrQ->front + 1) % MAXSIZE;
        return PtrQ->Data[PtrQ->front];
    }
}
